package jp.co.toshiba.ffsa.action.cses;

import java.util.ArrayList;
import java.util.LinkedHashMap;

import javax.annotation.Resource;

import jp.co.toshiba.ffsa.action.common.CommonAction;
import jp.co.toshiba.ffsa.common.ListBox;
import jp.co.toshiba.ffsa.dto.LoginDto;
import jp.co.toshiba.ffsa.form.cses.Cses102Form;
import jp.co.toshiba.ffsa.service.common.CommonService;
import jp.co.toshiba.ffsa.service.common.ConstantValue;
import jp.co.toshiba.ffsa.service.cses.Cses102Service;

import org.seasar.struts.annotation.ActionForm;
import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.MessageResourcesUtil;
import org.seasar.struts.util.RequestUtil;

/**
 * 簡易(通常入力)
 * @author npc
 */
public class Cses102Action extends CommonAction {
    /** 画面ID */
    public String screenID = "CSES102";

    /** アクションフォーム */
    @ActionForm
    @Resource
    protected Cses102Form cses102Form;

    /** Logic sizeリストボックス作成用 */
    public LinkedHashMap<String, String> logicSizeList = new LinkedHashMap<String, String>();

    /** Serdes 有無リストボックス作成用 */
    public LinkedHashMap<String, String> serdesFlagList = new LinkedHashMap<String, String>();

    /** PKG-typeリストボックス作成用 */
    public LinkedHashMap<String, String> pkgTypeList = new LinkedHashMap<String, String>();

    /** Quantityリストボックス作成用 */
    public LinkedHashMap<String, String> quantityList = new LinkedHashMap<String, String>();

    /** メールアドレス */
    public String mailAddress = "";

    /** 価格 */
    public String[] price = new String[2];

    /**
     * 初期処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String index() throws Exception {
        // ログイン済判定
        if(this.judgeLogin(cses102Form.getSessionId())){
            try {
                // リファラ判定
                if(this.judgeRefferer()){
                    // メールアドレス取得
                    this.getMailAddress();

                    // リストボックス作成
                    this.getListBox();
                }else{
                    return this.topTransition;
                }
            } catch (Exception e) {
                // ログ出力
                this.errorLogWriter(e, "index", this.screenID);
                throw e;
            }
            return "/cses/cses102.jsp";
        }else{
            return this.topTransition;
        }
    }

    /**
     * 見積処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = true, input="/cses/cses102/error")
    public String submit() throws Exception {
        // ログイン済判定
        if(this.judgeLogin(cses102Form.getSessionId())){
            try {
                // リファラ判定
                if(this.judgeRefferer()){
                    // メールアドレス取得
                    this.getMailAddress();

                    // リストボックス作成
                    this.getListBox();

                    Cses102Service service = new Cses102Service();

                    // サービスにフォームの入力値をセット
                    service.setLogicSizeKind(this.cses102Form.logicSizeKind);
                    service.setLogicSize(this.cses102Form.logicSize);
                    service.setSramSize(this.cses102Form.sramSize);
                    service.setIoCount(this.cses102Form.ioCount);
                    service.setSerdesCount(this.cses102Form.serdesCount);
                    service.setPkgType(this.cses102Form.pkgType);
                    service.setQuantity(this.cses102Form.quantity);

                    // 価格取得
                    this.price = service.getPrice();

                    // 操作ログ登録
                    ArrayList<ArrayList<String>> parameters = new ArrayList<ArrayList<String>>();
                    ArrayList<String> parameterNames = new ArrayList<String>();
                    ArrayList<String> values = new ArrayList<String>();
                    parameterNames.add(MessageResourcesUtil.getMessage("total"));
                    values.add(this.price[0]);
                    parameterNames.add(MessageResourcesUtil.getMessage("logic_size_kind"));
                    values.add(this.cses102Form.logicSizeKind);
                    parameterNames.add(MessageResourcesUtil.getMessage("logic_size"));
                    values.add(this.cses102Form.logicSize);
                    parameterNames.add(MessageResourcesUtil.getMessage("sram_size"));
                    values.add(this.cses102Form.sramSize);
                    parameterNames.add(MessageResourcesUtil.getMessage("io_count"));
                    values.add(this.cses102Form.ioCount);
                    parameterNames.add(MessageResourcesUtil.getMessage("serdes_flag"));
                    values.add(this.cses102Form.serdesFlag);
                    parameterNames.add(MessageResourcesUtil.getMessage("serdes_count"));
                    values.add(this.cses102Form.serdesCount);
                    parameterNames.add(MessageResourcesUtil.getMessage("frequency_requirement"));
                    values.add(this.cses102Form.frequencyRequirement);
                    parameterNames.add(MessageResourcesUtil.getMessage("pkg_type"));
                    values.add(this.cses102Form.pkgType);
                    parameterNames.add(MessageResourcesUtil.getMessage("quantity"));
                    values.add(this.cses102Form.quantity);
                    parameterNames.add(MessageResourcesUtil.getMessage("use_for"));
                    values.add(this.cses102Form.useFor);
                    parameterNames.add(MessageResourcesUtil.getMessage("development_schedule"));
                    values.add(this.cses102Form.developmentSchedule);
                    parameterNames.add(MessageResourcesUtil.getMessage("target_nre"));
                    values.add(this.cses102Form.targetNre);
                    parameterNames.add(MessageResourcesUtil.getMessage("target_price"));
                    values.add(this.cses102Form.targetPrice);
                    parameterNames.add(MessageResourcesUtil.getMessage("ip"));
                    values.add(this.cses102Form.ip);
                    parameters.add(parameterNames);
                    parameters.add(values);
                    this.entryOperationHistory(this.screenID, "submit", parameters, ConstantValue.success);
                }else{
                    return this.topTransition;
                }
            } catch (Exception e) {
                // ログ出力
                this.errorLogWriter(e, "index", this.screenID);
                throw e;
            }
            return "/cses/cses102.jsp";
        }else{
            return this.topTransition;
        }
    }

    /**
     * 初期化処理
     * @return 画面遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String clear() throws Exception {
        // ログイン済判定
        if(this.judgeLogin(cses102Form.getSessionId())){
            try {
                // リファラ判定
                if(this.judgeRefferer()){
                    // フォーム初期化
                    this.cses102Form.reset();

                    // メールアドレス取得
                    this.getMailAddress();

                    // リストボックス作成
                    this.getListBox();
                }else{
                    return this.topTransition;
                }
            } catch (Exception e) {
                // ログ出力
                this.errorLogWriter(e, "clear", this.screenID);
                throw e;
            }
            return "/cses/cses102.jsp";
        }else{
            return this.topTransition;
        }
    }

    /**
     * バリデーションエラー処理
     * @return 遷移先
     * @throws Exception
     */
    @Execute(validator = false)
    public String error() throws Exception{
        return index();
    }

    /**
     * メールアドレス取得
     * @throws Exception
     */
    public void getMailAddress() throws Exception {
        CommonService service = new CommonService();

        // ユーザID取得
        String userId = ((LoginDto)RequestUtil.getRequest().getSession().getAttribute("login_dto")).getUserID();

        // メールアドレス取得
        this.mailAddress = service.getUserInfo(userId).mailAddress;
    }

    /**
     * リストボックス作成
     * @throws Exception
     */
    public void getListBox() throws Exception {
        ListBox listbox = new ListBox();

        this.logicSizeList  = listbox.getLogicSizeListBox();     // Logic sizeリストボックス
        this.serdesFlagList = listbox.getSerdesFlagListBox();    // Serdes 有無リストボックス
        this.pkgTypeList    = listbox.getPkgTypeListBox("", ""); // PKG-typeリストボックス
        this.quantityList   = listbox.getQuantityListBox();      // Quantityリストボックス
    }
}